package com.qfedu;

import qfedu.dao.ProjectDao;
import qfedu.model.Project;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Demo {
    //Junit有核心注解@Before  @After
    SqlSession sqlSession;
    ProjectDao projectDao;

    @Before  //代表的在目标单元测试执行之前执行
    public void init() {
//        System.out.println("目标方法执行之前执行");
        //通过源码可以发现，mybatis底层实现通过反射+代理+工厂去实现的
        //完成mybatis开发
        try {
            //加载配置文件,得到输入流
            InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
            //创建一个工厂构建对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            //构建对象得到核心工厂
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream); //构建者模式对属性进行赋值
            //获取sqlsession
//            sqlSession = sessionFactory.openSession();  //默认是手动提交
            sqlSession = sqlSessionFactory.openSession(true);  //true :自动提交事务
            //获取持久层接口代理对象
            projectDao = sqlSession.getMapper(ProjectDao.class);
            //3个参数 第一个参数：被代理对象的类加载器
            //第二个参数:被代理对象所实现的所有接口
            //第三个参数：执行增强的业务操作
            //代理对象 、被代理对象 、代理协议（增强）
            // Proxy.newProxyInstance()

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @After
    public void close() {
        sqlSession.close();
    }

    @Test
    public void demo() {
        //关联查询，查询所有的工程同时将开发商查询出来
        //一对多查下，查询所有的工程同时将关联的工程阶段查询出来
        List<Project> projects = projectDao.findProjects();
        projects.stream().forEach(System.out::println);

    }

}
